\subsection{Adressierungsmodi}
\myindex{ARM!Addressing modes}
\label{ARM_postindex_vs_preindex}
\myindex{\CLanguageElements!\PostIncrement}
\myindex{\CLanguageElements!\PostDecrement}
\myindex{\CLanguageElements!\PreIncrement}
\myindex{\CLanguageElements!\PreDecrement}
Der folgende Befehl ist in ARM64 zulässig:

\myindex{ARM!\Instructions!LDR}
\begin{lstlisting}[style=customasmARM]
ldr	x0, [x29,24]
\end{lstlisting}
Das bedeutet, wir addieren 24 zum Wert in X29 und laden den Wert an dieser Adresse

Man beachte, dass die 24 sich innerhalb der Klammern befindet. Die Bedeutung ist eine andere, wenn die Zahl außerhalb
der Klammer steht:

\begin{lstlisting}[style=customasmARM]
ldr	w4, [x1],28
\end{lstlisting}

Das bedeutet, wir laden den Wert an der Adresse in X1 und addieren dann 28 zu X1.

\myindex{PDP-11}
ARM erlaubt die Addition oder Subtraktion einer Konstanten zu bzw. von einer für einen Ladebefehl benötigten Adresse.

Es ist möglich dies vor und nach dem Laden zu tun.

Es gibt keinen derartigen Adressierungsmodus in x86, aber auch in anderen Prozessoren, sogar auf PDP-11.

Es gibt die Legende, dass die Pre-Inkrement-, Post-Inkrement-, Pre-Dekrement und Post-Dekrement-Modi in PDP-11 für das
Erscheinen von C-Konstrukten (welche auf PDP-11 entwickelt wurden) wie *ptr++, *++ptr, *ptr-{}-, *-{}-ptr verantwortlich
sind.

Dabei handelt es sich übrigens um ein schwer zu merkendes Feature von C. Es funktioniert wie folgt:

\small
% FIXME: add ARM assembly...
\begin{center}
\begin{tabular}{ | l | l | l | l | }
\hline
\headercolor{} C Term & 
\headercolor{} ARM Term & 
\headercolor{} C Ausdruck & 
\headercolor{} so funktioniert er \\
\hline
\PostIncrement & 
post-indexed Adressierung & 
\TT{*ptr++} & 
verwende \TT{*ptr} Wert, \\
& & & dann \glslink{increment}{inkrementiere} \\
& & & \TT{ptr} Pointer \\
\hline
\PostDecrement & 
post-indexed Adressierung & 
\TT{*ptr-{}-} & 
verwende \TT{*ptr} Wert, \\
& & & dann \glslink{decrement}{dekrementiere} \\
& & & \TT{ptr} Pointer \\
\hline
\PreIncrement & 
pre-indexed Adressierung & 
\TT{*++ptr} & 
\glslink{increment}{inkrementiere} \TT{ptr} Pointer, \\
& & & dann verwende \\
& & & \TT{*ptr} Wert \\
\hline
\PreDecrement & 
pre-indexed Adressierung & 
\TT{*-{}-ptr} & 
\glslink{decrement}{dekrementiere} \TT{ptr} Pointer, \\
& & & dann verwende \\
& & & \TT{*ptr} Wert \\
\hline
\end{tabular}
\end{center}
\normalsize
Pre-indexing wird in der ARM Assemblersprache mit einem Ausrufezeichen kenntlich gemacht.
Zum Beispiel in der Zeile 2 in  \lstref{hw_ARM64_GCC}.

Dennis Ritchie (einer der Erfinder von C) hat erwähnt, dass diese Modi vermutlich deshalb von Ken Thompson (einem
anderen Erfinder von C) erfunden wurde, weil es dieses Prozessorfeature in PDP-7 bereits
gab\footnote{\url{http://yurichev.com/mirrors/C/c_dmr_postincrement.txt}}, \RitchieDevC{}.

Dadurch können C-Compiler das Feature nutzen, wenn es auch auf dem Zielprozessor implementiert ist.

Es ist sehr nützlich und gebräuchlich beim Verarbeiten von Arrays.
